package sqlsource.impl;

import mapping.BoundSql;
import mapping.DynamicContext;
import sqlnode.SqlNode;
import sqlsource.SqlSource;
import sqlsource.SqlSourceParser;

/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-01-04 14:52
 * @notify DynamicSqlSource可能包含 #{} ${} 和<if>标签等。可能包含所有类型的sqlNode
 * @version 1.0
 */
public class DynamicSqlSource implements SqlSource {

    private SqlNode mixedSqlNode;

    public DynamicSqlSource(SqlNode mixedSqlNode) {
        this.mixedSqlNode = mixedSqlNode;
    }

    @Override
    public BoundSql getBoundSql(Object param) throws Exception {
        /*此处需要注意，因为有多个sqlNode，他们单独执行自己的解析过程，但是，如果sql是
         * TextSqlNode 他包含${} 但是也可能包含 #{} 此时保险起见，我们需要再次解析sql将
         * #{} 替换成 ？ 并封装#{name} 中的name
         * */
        DynamicContext dynamicContext = new DynamicContext(param);
        mixedSqlNode.apply(dynamicContext);
        //将 #{ } 替换成 ？ 然后将内容存储到 ParameterMapping 中
        SqlSourceParser parser = new SqlSourceParser(dynamicContext);
        SqlSource sqlSource = parser.parse();
        return sqlSource.getBoundSql(param);
    }

}
